iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
自我挑戰組

網路通訊隨意聊系列 第 8

NAT(二),穿越 NAT 的牆,淺談 ngrok 及 Port Forwarding

  • 分享至 

  • xImage
  •  

上一講提到 NAT 雖然有效的解決了 IP 位置枯竭的問題,但這種透過轉譯來將公開 IP 位置對應到內網 IP 位置的方法,卻也造成了一些困擾!

NAT 帶來的問題

讓我們來聊聊一個軟體工程師時常會遇到情境:當你想要建立一個 Web Server 在你的個人電腦上,把架好的網站丟給朋友看一下時,會怎麼做呢?總不能把 localhost:80 這樣 Local IP 位置丟出去吧?

在個人電腦架設網站
*在個人電腦架設網站

所以你可能會看看自己這台電腦的 IP 位置,查了一下發現居然是一段 Class C 的虛擬 IP 位置,是被我們的路由器所分配的,至於我們僅有的一個 Public IP 位置 1.2.3.4,和個人電腦要怎麼究竟要怎麼對應起來呢?又是一大問題。

且慢,那前面不是說 NAT 能幫我們做公開和私有的 IP 位置轉譯嗎?是否能夠交給 NAT 自動去做?

雖然可以,但還真沒那麼自動。

發動請求時需要明確的 IP 位置及 Port
*發動請求時需要明確的 IP 位置及 Port

前面提到 NAT 幫忙轉譯時,發動來源於我們內網的某個裝置,所以路由器在幫忙傳遞請求的封包時,能夠在自己的小表格中建立內外網的對應。

然而,當你的朋友想要發起一個請求,只知道公開的 IP 位置是不夠的,因為路由器不知道要把封包轉送給誰。

這就是 NAT 可能帶來的困擾,難以「穿透」。

ngrok

遇到這樣的問題,我們要做的就是想辦法讓外網的設備找得到我們,那究竟要怎麼做到呢?

例如使用第三方的服務 ngrok,就是一種簡單快速的解法。

ngrok 架構簡圖
*ngrok 架構簡圖

我們知道 NAT 僅在請求方在內網向外發送請求時,能夠讓回傳的資訊找到家。那麼,我們就在個人電腦中裝一支 ngrok 的 Daemon(小程式)即可!

這支 Daemon 會主動向 ngrok 的伺服器發送請求,並且建立一段長久的連線,這個連線的動作稱之為 Tunneling。我們可以指定個人電腦上的 localhost:80 這個網站給 ngrok,讓其透過 tunnel 變相的「公開」了你的網站。

而 ngrok 會提供你一個如 xxx.ngrok.io 的 URL,你的朋友便可以透過這個 URL 讓 ngrok 當作一個中繼站,連到你在內網中個人電腦所架設的網站了。

然而,雖然 ngrok 簡單好用,但要使用還是得額外安裝 Daemon 在本機端,而且用的多了可是得付費的,畢竟人家可是架了許多 Server,也是有開銷的。

那有沒有其他方式可以穿越 NAT 的牆呢?

Port Forwarding

另一種讓別人找到我們的方法,就得提到 Port Forwarding 了,這是 NAT 的其中一種應用。但使用這個技術有個前提,就是你得有權限操作對外的路由器。

我們一樣來看看,如何讓架設在 192.168.1.2:80 的這個網站能夠被找到。當我們有了操作路由器的權限,應該可以看到類似下面的設定頁面。

Port Forwarding 設定
*Port Forwarding 設定

假設我們想讓朋友透過我們的 Public IP Address 1.2.3.4,搭配上 Port 5566 來連到網站,就可以將 External Port 設定成 5566,然後對應到本機電腦的 IP 及網站的 Port,就大功告成了。

本質上,也是一樣去修改 NAPT 的表格罷了,只不過這次是我們手動加上的邏輯。

今天聊了兩種 NAT 穿透的解法,實際上還有更複雜的穿透問題沒那麼容易解決的,我們接著聊。

參考資料

  1. Wiki - NAT 穿越

  2. ngrok

  3. Wiki - Port forwarding


上一篇
NAT(一),讓你 IP 位置用不完的 NAT 是怎麼做到的?
下一篇
NAT(三),對稱、錐形、為何有奇形怪狀的 NAT?
系列文
網路通訊隨意聊30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言